/*
 * constantes.h
 *
 *  Created on: 15-jul-2009
 *      Author: Pablo Izquierdo & Adrián Romero
 *
 *  El objetivo de esta clase es definir las constantes necesarias.
 */

#ifndef CONSTANTES_H_
#define CONSTANTES_H_

#include <stdlib.h>

//Valores de la variable debug
#define DEBUG_ON	1
#define DEBUG_OFF	0

//Valores de salida del programa
#define EXIT_ERROR			-1
#define EXIT_NORMAL			0
#define EXIT_NO_RESPUESTA	1

//Valores booleanos
#define FALSE 	0
#define TRUE 	1

#define DHCP_LEASE_INFINITO 0xFFFFFFFF
#define HTYPE_ETHERNET 1
#define HTYPE_ETHERNET_LENGTH 6
#define LONGITUD_CHAR 8
#define LONGITUD_MAXIMA_MENSAJE	576
#define LONGITUD_MAXIMA_OPCIONES 312
#define NUMERO_MAXIMO_DHCPOFFERS 10
#define OP_BOOTREQUEST 1
#define OP_BOOTREPLY 2
#define PUERTO_DHCP_CLIENTE 68
#define PUERTO_DHCP_SERVIDOR 67
// Longitud base de dhcp
#define DHCP_TAM_BASE 236;

#define TAM_PAQ_ARP 28
#define TAM_CAB_IP 20
#define TAM_CAB_ETH 14
#define TAM_CAB_ARP 28
#define BROADCAST_ETHER_ADDR "fe:fd:00:00:02:00"

#define PROBE_WAIT 1; //retardo aleatorio inicial
#define PROBE_NUM 3; //numero de paquetes 'probe'
#define PROBE_MIN 1; //retardo minimo hasta un 'probe' repetido
#define PROBE_MAX 2; //retardo maximo hasta un 'probe' repetido
#define ANNOUNCE_WAIT 2; //retardo antes de 'announcement'
#define ANNOUNCE_NUM 2; //numero de paquetes 'announcement'
#define ANNOUNCE_INTERVAL 2; //tiempo entre paquetes 'announcement'
#define MAX_CONFLICTS 10; //maximo numero de conflictos antes de limitar 'rate'
#define LIMIT_INTERVAL 60; //retardo entre sucesivos intentos
#define DEFEND_INTERVAL 10; //intervalo minimo entre ARPs defensivos

//Estados del cliente
enum mensajeDhcp {DHCPDISCOVER, DHCPOFFER, DHCPREQUEST, DHCPACK, DHCPNAK, DHCPDECLINE, DHCPRELEASE, PID, IP, DHCPSIGINT, DHCPSIGUSR2};

enum estados {INIT, SELECTING, REQUESTING, BOUND, RENEWING, REBINDING};

char *PARAMETRO_IFACE, *PARAMETRO_HOSTNAME, *DIRECCION, *DIRECCION_HW;//IFACE, HOSTNAME, ADDRESS, HADDRESS
struct in_addr *PARAMETRO_ADDRESS;//PARAM_ADDRESS

int VALOR_EXIT, PARAMETRO_TIMEOUT;//TIMEOUT
int TEMPORIZADOR_ACTUAL, TEMPORIZADOR_SEC, TEMPORIZADOR_USEC; //para la struct timeval
int TEMPORIZADOR_AUX, TEMP_TOTAL_T1, TEMP_TOTAL_T2, TEMP_SEC_T1, TEMP_USEC_T1, TEMP_SEC_T2, TEMP_USEC_T2;
int PARAMETRO_DEBUG;//DEBUG
int TAM_DIRECCION_HW, DHCP_SOCKET, NO_EXIT;//HADDRESS_SIZE
u_int32_t PARAMETRO_LEASE;//LEASE
unsigned int XID;

int ESTADO_ACTUAL;

// Direcciones y Options recibidas;
struct in_addr DIRECCION_SELECCIONADA;//SELECTED_ADDRESS
struct in_addr DIRECCION_SERVIDOR;//SERVER ADDRESS
struct sockaddr_in* MASCARA_RED;//SUBNET_MASK
int TAM_LISTA_ROUTERS, TAM_LISTA_DNS;//ROUTERS_LIST_SIZE
struct in_addr* LISTA_ROUTERS;//ROUTERS_LIST
char * NOMBRE_SERVIDOR;//SERVER_HOSTNAME
struct in_addr* LISTA_DNS;//DOMAIN_NAME_SERVER_LIST
char * NOMBRE_DOMINIO;//DOMAIN_NAME

#endif /* CONSTANTES_H_ */
